package br.com.caelum.vraptor.controller;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.inject.Inject;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Result;
import br.urca.dao.AlunosCursoDAO;
import br.urca.dao.BiAssuntosDAO;
import br.urca.dao.BiAssuntosMateriaisDAO;
import br.urca.dao.BiAutoresMateriaisDAO;
import br.urca.dao.BiEditorasDAO;
import br.urca.dao.BiMateriaisDAO;
import br.urca.dao.BiSeriesDAO;
import br.urca.dao.BiUnidadesDAO;
import br.urca.interceptor.InterceptResource;
import br.urca.model.BiAssuntos;
import br.urca.model.BiAssuntosMateriais;
import br.urca.model.BiAutoresMateriais;
import br.urca.model.BiCopias;
import br.urca.model.BiEditoras;
import br.urca.model.BiMateriais;
import br.urca.model.BiSeries;
import br.urca.model.BiUnidades;
import br.urca.model.HabilitacaoPK;
import br.urca.session.UsuarioLogado;

@Controller
@InterceptResource
public class IndexController {
	
	private UsuarioLogado usuarioLogado;
	private Result result;
	private ServletContext context;
	private HttpServletRequest httpRequest;
	private AlunosCursoDAO mAlunosCursoDAO;
	private BiMateriaisDAO mBiMateriaisDAO;
	private BiAutoresMateriaisDAO mBiAutoresMateriaisDAO;
	private BiAssuntosDAO mBiAssuntosDAO;
	private BiAssuntosMateriaisDAO mBiAssuntosMateriaisDAO;
	private BiSeriesDAO mBiSeriesDAO;
	private BiEditorasDAO mEditorasDAO;
	private BiUnidadesDAO mBiUnidadesDAO;
	
	public IndexController() { }
	
	@Inject
	public IndexController(UsuarioLogado usuarioLogado, Result result,
			BiAutoresMateriaisDAO mBiAutoresMateriaisDAO,
			BiUnidadesDAO mBiUnidadesDAO, BiSeriesDAO mBiSeriesDAO,
			AlunosCursoDAO mAlunosCursoDAO, ServletContext context,
			BiEditorasDAO mEditorasDAO, BiAssuntosDAO mBiAssuntosDAO,
			BiMateriaisDAO mBiMateriaisDAO,
			BiAssuntosMateriaisDAO mBiAssuntosMateriaisDAO,
			HttpServletRequest httpRequest) {
		this.result = result;
		this.usuarioLogado = usuarioLogado;
		this.context = context;
		this.httpRequest = httpRequest;
		this.mAlunosCursoDAO = mAlunosCursoDAO;
		this.mBiAutoresMateriaisDAO = mBiAutoresMateriaisDAO;
		this.mBiAssuntosDAO = mBiAssuntosDAO;
		this.mBiAssuntosMateriaisDAO = mBiAssuntosMateriaisDAO;
		this.mBiMateriaisDAO = mBiMateriaisDAO;
		this.mBiSeriesDAO = mBiSeriesDAO;
		this.mEditorasDAO = mEditorasDAO;
		this.mBiUnidadesDAO = mBiUnidadesDAO;
	}

	@Path("/")
	public void index() {
		
		String nomeArquivo = (usuarioLogado.getAlunoCurso() != null ? usuarioLogado
				.getAlunoCurso().getMatricula() : usuarioLogado
				.getFuncionario().getMatricula()).concat(".jpg");
		
		String imagem = context.getInitParameter("pathFotos") + "/"
				+ nomeArquivo;	
		
		
		File file = new File(imagem);
		if (!file.exists()) {
			imagem = "user.png";
		} else {
			imagem = nomeArquivo;
		}
				
		
		httpRequest.getSession().setAttribute("foto", "http://"+httpRequest
								.getServerName()
								.concat(":")
								.concat(String.valueOf(httpRequest
										.getServerPort())).concat("/fotos/").concat(imagem));	
	}
	
	@PostConstruct
	public void buscarUnidades() {
		List<BiUnidades> unidadesList =  mBiUnidadesDAO.getList();
		result.include("listaUnidades", unidadesList);
	}
	
	public void buscar(String filtro, int tipoFiltro, Character tipoMaterial, Short unidade ) {
		
		try {
			if (filtro != null && filtro.trim().length() < 3) {
				throw new Exception("A pesquisa deve ter no mínimo 3 caracteres.");	
			}
			if (filtro != null && !filtro.isEmpty()) {
				List<BiMateriais> mList = null;
				switch (tipoFiltro) {
					case 1: {
						if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
							mList = mBiMateriaisDAO.getListPorTitulo(filtro);
						} else {
							mList = mBiMateriaisDAO.getListPorTitulo(filtro, tipoMaterial);
						}
					}
					break;
					
					case 2: {
						List<BiAutoresMateriais> mListBiAutoresMateriais;
						if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
							mListBiAutoresMateriais = mBiAutoresMateriaisDAO.getListPorAutor(filtro);
						} else {
							mListBiAutoresMateriais = mBiAutoresMateriaisDAO.getListPorAutor(filtro, tipoMaterial);
						}
						if (mListBiAutoresMateriais != null && !mListBiAutoresMateriais.isEmpty()) {
							mList = new ArrayList<BiMateriais>();
							for (BiAutoresMateriais bam: mListBiAutoresMateriais) {
								BiMateriais mBiMateriais = mBiMateriaisDAO.getPorTipoNumeroMaterial(bam.getBiAutoresMateriaisPK().getCodTipoMaterial(),
										bam.getBiAutoresMateriaisPK().getCodNumeroMaterial());
								if (mBiMateriais != null)
									mList.add(mBiMateriais);
							}
						}
					}
					break;
						
					case 3: {
						if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
							mList = mBiMateriaisDAO.getListPorArea(filtro);
						} else {
							mList = mBiMateriaisDAO.getListPorArea(filtro, tipoMaterial);
						}
					}
					break;
					
					case 4: {					
						mList = buscarPorAssunto(filtro, tipoMaterial);
					}
					break;
					
					case 5: {					
						mList = mBiMateriaisDAO.getListPorISBNISSN(filtro);
					}
					break;
					
					case 6: {
						List<BiSeries> mSeries = mBiSeriesDAO.getPorDescricao(filtro);
						if (mSeries != null && !mSeries.isEmpty()) {
							mList = new ArrayList<BiMateriais>();
							if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
								for (BiSeries bs: mSeries) {
									mList.add(mBiMateriaisDAO.getPorSerie(bs.getCodSerie()));	
								}
							} else {
								for (BiSeries bs: mSeries) {
									mList.add(mBiMateriaisDAO.getPorSerie(bs.getCodSerie(), tipoMaterial));	
								}
							}
						}
						
					}
					break;
					
					case 7: {
						List<BiEditoras> mEditoras = mEditorasDAO.getPorNome(filtro);
						if (mEditoras != null && !mEditoras.isEmpty()) {
							mList = new ArrayList<BiMateriais>();
							if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
								for (BiEditoras be: mEditoras) {
									mList.addAll(mBiMateriaisDAO.getPorEditora(be.getCodEditora()));	
								}
							} else {
								for (BiEditoras be: mEditoras) {
									mList.addAll(mBiMateriaisDAO.getPorEditora(be.getCodEditora(), tipoMaterial));	
								}
							}
						}
						
					}
					break;
		
					default: mList = mBiMateriaisDAO.getListPorTitulo(filtro);
						break;
				}
				
				//Unidades
				verificarUnidades(mList, unidade);
				
				if (mList != null && !mList.isEmpty()) {
					
					result.include("listaMateriais", mList).include("filtro", filtro).redirectTo(this).index();
				} else
					result.include("mensagem","Nenhum material encontrado no servidor!").redirectTo(this).index();
			} else {
				result.include("mensagem","Nenhum material encontrado no servidor!").redirectTo(this).index();
			}
		} catch(Exception e) {
			result.include("mensagem",e.getMessage()).redirectTo(this).index();
		}
	}
	
	private void verificarUnidades(List<BiMateriais> mList, Short unidade) {
		if (mList != null && !mList.isEmpty()) {
			if (unidade != null && unidade != 0) {
				for (int i = 0; i < mList.size(); i++) {
					if (mList.get(i).getBiCopiasList() != null
							&& !mList.get(i).getBiCopiasList().isEmpty()) {
						for (BiCopias bc: mList.get(i).getBiCopiasList()) {
							if (bc.getCodUnidade().getCodUnidade() != unidade) {
								mList.remove(i);
								verificarUnidades(mList, unidade); //Recursivo
								break;
							}
						}
					}						
				}
			}
		}
	}
	
	private List<BiMateriais> buscarPorAssunto(String filtro, Character tipoMaterial) {
		
		List<BiMateriais> mList = null;
		List<BiAssuntos> listAssuntos = mBiAssuntosDAO.getPorDescricao(filtro);
		List<BiAssuntosMateriais> listBiAssuntosMateriais = null;
		
		mList = new ArrayList<BiMateriais>();

		if (listAssuntos != null && !listAssuntos.isEmpty()) {

			List<Short> listCodigosAssuntos = new ArrayList<Short>();
			for (BiAssuntos ba : listAssuntos) {
				listCodigosAssuntos.add(ba.getCodAssunto());
			}

			listBiAssuntosMateriais = mBiAssuntosMateriaisDAO
					.getPorAssuntos(listCodigosAssuntos);
		}

		if (listBiAssuntosMateriais != null
				&& !listBiAssuntosMateriais.isEmpty()) {

			for (BiAssuntosMateriais b : listBiAssuntosMateriais) {
				BiMateriais mBiMateriais = null;
				if (String.valueOf(tipoMaterial).equalsIgnoreCase("0")) {
					mBiMateriais = mBiMateriaisDAO
							.getPorTipoNumeroMaterial(b.getId()
									.getCodTipoMaterial(), b.getId()
									.getCodNumeroMaterial());
				} else {
					if (b.getId().getCodTipoMaterial()
							.equals(tipoMaterial)) {
						mBiMateriais = mBiMateriaisDAO
								.getPorTipoNumeroMaterial(b.getId()
										.getCodTipoMaterial(), b
										.getId().getCodNumeroMaterial());
					}
				}
				if (mBiMateriais != null) {
					mList.add(mBiMateriais);
				}
			}

		}// fim if
		
		return mList;
	}
	
}